﻿#pragma once

#include <vector>
#include "scheme_def.h"



struct sqlite3;

class WubiDb {
public:
    WubiDb();
    ~WubiDb();
    
    // 数据库初始化（创建表格）
    bool initialize(const std::string &dbPath);
    
    // 方案管理 返回0失败
    MengYuIDType createScheme(const std::string& name);
    bool deleteScheme(MengYuIDType schemeId);
    bool getAllSchemes(std::vector<WubiBaseInfoPtr> &out_schemes);
    bool getSchemeInfo(MengYuIDType schemeId, WubiBaseInfo &out_scheme);
    
    // 码表管理
    MengYuIDType addCodeTable(MengYuIDType schemeId, const std::string& name);
    bool removeCodeTable(MengYuIDType codeTableId);
    bool getCodeTables(MengYuIDType schemeId,std::vector<WubiBaseInfoPtr> &out_tables);

    // 词库管理
    MengYuIDType addWord(MengYuIDType codeTableId, const std::string& code, const std::string& word);
    bool removeWord(MengYuIDType codeTableId, const std::string& code, const std::string& word);
    
    // 删除单个词条
    bool removeWord(MengYuIDType code_id);
   
    //获取码表数据
    bool getCodeTableData(MengYuIDType codeTableId, std::vector<std::pair<std::string, std::string>>& out_data);

    //根据编码获取码表数据
    bool getCodeTableDataByCode(MengYuIDType codeTableId, const std::string &code, std::vector<WubiCodetableData> &out_data);
    // 交换两的个码表词条的顺序
    bool swapCodeTableDataOrder(MengYuIDType codeTableId, MengYuIDType code_id1, MengYuIDType code_id2);

    // 从文件导入码表数据
    bool importCodeTableData(MengYuIDType codeTableId, const std::vector<std::string>& file_path);
    // 码表数据导入
    bool importCodeTableData(MengYuIDType codeTableId, 
        const std::vector<std::pair<std::string, std::string>>& data);
    
    // 默认方案设置 
    bool setDefaultScheme(MengYuIDType schemeId);

    //返回0失败
    MengYuIDType getDefaultScheme();
    
    // 方案更新
    bool updateScheme(MengYuIDType schemeId, const std::string& name, int candidateCount);
    
    // 交换码表顺序
    bool swapCodeTableOrder(MengYuIDType codeTableId1, MengYuIDType codeTableId2);

    //设置码表启用
    bool setCodeTableEnable(MengYuIDType codeTableId, bool enable);

    //编码反查，根据方案和词获取所有启用码表的编码,
    bool getCodeByWord(MengYuIDType schemeId, const std::string &word,std::vector<std::string> &out_codes);

    //导出码表
    bool exportCodeTable(MengYuIDType codeTableId, const std::string &file_path);

private:
    sqlite3* _db;
    bool executeSQL(const std::string& sql);
};